// Copyright (C) 2011 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset
es6id: 13.7.5.13
description: >
    let ForDeclaration: creates a fresh binding per iteration
---*/

function Test() {
    var fns = {};
    var obj = Object.create(null);
    obj.a = 1;
    obj.b = 1;
    obj.c = 1;

    for (let x in obj) {
      // Store function objects as properties of an object so that their return
      // value may be verified regardless of the for-in statement's enumeration
      // order.
      fns[x] = function() { return x; };
    }

    assert.sameValue(typeof fns.a, 'function', 'property definition: "a"');
    assert.sameValue(fns.a(), 'a');
    assert.sameValue(typeof fns.b, 'function', 'property definition: "b"');
    assert.sameValue(fns.b(), 'b');
    assert.sameValue(typeof fns.c, 'function', 'property definition: "c"');
    assert.sameValue(fns.c(), 'c');
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_TEST; i++) {
    Test();
}
